import { Alert, Tabs, TabItem } from '@aws-amplify/ui-react'; import { Example, ExampleCode } from '@/components/Example'; ## Overview Amplify UI supports color modes/schemes, like Dark Mode, through theme overrides. Amplify UI Theme Overrides let you define different theme styles in different contexts, such as color mode. ## ThemeProvider The `ThemeProvider` accepts a `colorMode` prop which can be `light`, `dark`, or `system`. If you have multiple `ThemeProvider`s in your application, make sure to store `colorMode` in the application's state or context and pass it to each `ThemeProvider` or else some parts of your app won't have the right color mode applied. Also, because the theme uses CSS variables which are inherited, your application can have some weird behavior with nested themes and color modes. ## Default Dark Mode Amplify UI comes with a default dark mode that you can use. Import the `defaultDarkModeOverride` and add it to the overrides array in your theme. If you want to honor your users' operating system preference for color mode, you can send the `useColorScheme` hook from React Native to the `colorMode` prop on the `ThemeProvider`. ```jsx import * as React from 'react'; import { useColorScheme } from 'react-native'; import { defaultDarkModeOverride, ThemeProvider } from '@aws-amplify/ui-react-native'; const theme = { overrides: [defaultDarkModeOverride], }; export const DefaultDarkMode = () => { const colorMode = useColorScheme(); return ( {/* ... */} ); }; ``` You can also control the color mode in your application as well by keeping a state variable that is either `'light'` or `'dark'`. ```jsx import * as React from 'react'; import { Pressable, Text } from 'react-native'; import { ThemeProvider } from '@aws-amplify/ui-react-native'; const theme = { overrides: [defaultDarkModeOverride], }; export const CustomDarkModeExample = () => { const [colorMode, setColorMode] = React.useState('light'); return ( // Note: color mode overrides are scoped to the ThemeProvider // if you use multiple providers setColorMode(colorMode === 'light' ? 'dark' : 'light')}> Change theme ); }; ``` ## Custom dark mode You can create your own dark mode override as well. The dark mode override will be applied when `colorMode` on the `ThemeProvider` is set to `dark`. ```jsx const theme = { overrides: [ { colorMode: 'dark', tokens: { colors: { font: { primary: '{colors.pink.100}', secondary: '{colors.pink.90}', tertiary: '{colors.pink.80}', }, background: { primary: '{colors.purple.10}', secondary: '{colors.purple.20}', tertiary: '{colors.purple.40}', }, border: { primary: '{colors.pink.60}', secondary: '{colors.pink.40}', tertiary: '{colors.pink.20}', }, }, }, }, ], }; ```